home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 January - Disc 2 / Macworld (1999-01) (Disk 2).dmg / 4th Dimension 6.0.6 demo / Databases / 3rd Party Internet Demos / Netlink Demo / MacOS / NetLink_examples / AuthHeader next >
Encoding:
Text File  |  1998-02-02  |  5.0 KB  |  150 lines  |  [TEXT/ttxt]

  1. The following is a description and sample code of how I handle user
  2. The following was submitted by Peter Thomas:
  3. _____________________________________________________________
  4.  
  5. The following is a description and sample code of how I handle user
  6. authentication in my database. Feel free to mod to your requirements.
  7.  
  8. First, you need to define a basic authentication header which will replace
  9. the standard 200 header. You can see this header in Webstar's log if you
  10. switch on realms and try to hit a page in a secure realm.
  11.  
  12.  
  13. ------
  14. C_STRING(255;◊vAuthHdr)
  15. ◊vAuthHdr:="HTTP/1.0 401 Unauthorized"+◊crlf+"Server: WebSTAR/1.1
  16. "+◊crlf+"MIME-Version: 1.0"+◊crlf+"WWW-Authenticate: Basic realm="
  17.  
  18.  
  19. --------
  20.  
  21. Then I have a little routine which outputs the authentication prompt on
  22. demand. I didn't used to do this, until I got caught by a 'feature' in
  23. 1.1b4 which won't let you set the HTTP header. So you set it to null, and
  24. just appendreply the authentication header.
  25. The old, more logical, code is commented out.
  26. I encase my realm in @ characters just to make it stand out, as in some
  27. cases I am putting long messages in there to tell the user what to do, eg
  28. "enter your credit card number now" which looks a bit funny in the middle
  29. of a "Enter user name for " .... " on 123.123.123.123" type prompt.
  30. -------
  31.   ` Procedure PTAuthPr
  32.   ` puts out the http authentication prompt
  33.   ` with the user realm specified by $1
  34.  
  35. C_STRING(255;$sRealm;$1)
  36. $sRealm:=$1
  37.  
  38.   `NL_SetHTTPHdr (VReqID;◊vAuthHdr+◊quote+"@"+$sRealm+"@"+◊quote+◊crlf+◊crlf)
  39.   `NL_AppendReply (vReqID;"")
  40.  
  41. NL_SetHTTPHdr (VReqID;"")
  42. NL_AppendReply (vReqID;◊vAuthHdr+◊quote+"@"+$sRealm+"@"+◊quote+◊crlf+◊crlf)
  43. -------
  44.  
  45. Then I have a routine which allows people to log in to the system. I put a
  46. field on the form for them to put in their user name as well as put it into
  47. the authentication prompt. This may look superfluous, but believe me, I
  48. found it almost impossible to work out where a user was in the input
  49. process unless I had this independent field to tell me who he wanted to log
  50. in as. Remember, browsers will remember a user name and password until they
  51. are forced not to. So If you have multiple users logging in to one machine,
  52. it can be difficult trying to force the browser to forget the previous user
  53. and get a new one.
  54. --------
  55.  
  56.  
  57.  
  58.     $UName:=aFields{$NameIndx}
  59.  
  60.     If (vUser#$UName)  ` wants to log in as someone else
  61.       PTAuthPr ("EQUALS")
  62.     Else
  63.  
  64.       SEARCH([User4];[User4]Name=vUser)
  65.       If (Records in selection([User4])#1)
  66.         PTAuthPr ("EQUALS")
  67.       Else
  68.           ` found the user ok, but is the password correct
  69.         If (vPass#[User4]Password)
  70.           PTAuthPr ("Incorrect password")
  71.         Else
  72.           [User4]LoggedIn:=True
  73.           [User4]LoginDate:=Current date
  74.           [User4]LoginTime:=Current time
  75.           SAVE RECORD([User4])
  76.           Case of
  77.             : ([User4]Type=◊Student)
  78.               EqStudent
  79.             : ([User4]Type=◊Agent)
  80.               EqAgent
  81.             : ([User4]Type=◊Institution)
  82.               EqInst
  83.           End case
  84.           UNLOAD RECORD([User4])
  85.         End if
  86.       End if
  87.     End if
  88.  
  89. -------
  90. Then for every procedure which can be called from outside via the browser,
  91. I have an authorisation check which determines whether the user is logged
  92. in, and then whether they can validly access this particular function.
  93. -------
  94.  
  95.  
  96.   ` Procedure PTAuthCheck
  97.   ` checks the current user name and password against the function and button
  98.   ` (if any exists) which they are trying to invoke
  99.   ` This routine outputs any error messages or prompts required
  100.  
  101. C_STRING(64;$System;$Function;$Action)
  102.  
  103. $System:=$1  ` the current system name
  104. $Function:=$2  ` the name of the function being accessed
  105. $Action:=$3  ` the name of the button being actioned
  106. $0:=◊NOK  ` Nobody gets past unless specifically authorised!
  107.  
  108. If (vUser="")
  109.   vErrMsg:="Sorry, no user name, please log in first."
  110.   NL_AppendReply (vReqID;vErrMsg)
  111. Else
  112.   READ WRITE([User4])
  113.   SEARCH([User4];[User4]Name=vUser)
  114.   If (Records in selection([User4])#1)
  115.     vErrMsg:="Sorry, invalid user name, please log in."
  116.     NL_AppendReply (vReqID;vErrMsg)
  117.   Else
  118.     If (vPass#[User4]Password)
  119.       vErrMsg:="Your password is not correct"
  120.       NL_AppendReply (vReqID;vErrMsg)
  121.     Else
  122.       If (Not([User4]LoggedIn))
  123.         vErrMsg:="Please log in first."
  124.         NL_AppendReply (vReqID;vErrMsg)
  125.       Else
  126.         If ([User4]LoginTime<(Current time-3600))
  127.           [User4]LoggedIn:=False
  128.           SAVE RECORD([User4])
  129.           vErrMsg:="Please log in again."
  130.           NL_AppendReply (vReqID;vErrMsg)
  131.         Else
  132.           [User4]LoggedIn:=True
  133.           [User4]LoginDate:=Current date
  134.           [User4]LoginTime:=Current time
  135.           vUserID:=[User4]ID
  136.           SAVE RECORD([User4])
  137.           Case of
  138.             : ([User4]Type=◊Student)
  139.            etc, etc, checking for each function type, name, action, etc
  140.  
  141. ----
  142.  
  143. Note, I don't do any communication with Webstar and it's user names and
  144. passwords. All my pages are served from 4D, so there is no need, although
  145. it can be done.
  146.  
  147. Cheers
  148. Peter Thomas
  149. pthomas@spirit.com.au
  150.